package com.clicacao.library;

import java.util.ArrayList;
import java.util.HashMap;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHandler extends SQLiteOpenHelper{
	
	//Variaveis estaticas do banco de dados
	//Versao do banco
	private static final int DATABASE_VERSION = 2;
	
	//Nome do banco de dados
	private static final String DATABASE_NAME = "clicacaov6.db";
	
	//Nome das tabelas do banco de dados
	private static final String TABLE_USUARIO = "usuario";
	private static final String TABLE_AVENTURASUSUARIO = "aventuras";
	private static final String TABLE_OBJETOSAVENTURA = "objetos";
	
	//Strings para criacao das tabelas no banco de dados
	//Criacao da tabela de usuarios
	private static final String CREATE_TABLE_USUARIO = "CREATE TABLE IF NOT EXISTS " + TABLE_USUARIO + " ("
			+ "_id" + " INTEGER PRIMARY KEY, "
			+ "nome" + " TEXT, "
			+ "id_avatar" + " TEXT, "
			+ "id_container" + " TEXT, "
			+ "id_mochila" + " TEXT, "
			+ "email" + " TEXT UNIQUE" + ");";
	
	//Criacao da tabela de aventuras dos usuarios
	private static final String CREATE_TABLE_AVENTURASUSUARIO = "CREATE TABLE IF NOT EXISTS " + TABLE_AVENTURASUSUARIO + " ("
			+ "_id" + " INTEGER PRIMARY KEY, "
			+ "titulo" + " TEXT, "
			+ "descricao" + " TEXT" + ");";
	
	//Criacao da tabela de objetos de uma aventura do usuario
	private static final String CREATE_TABLE_OBJETOSAVENTURA = "CREATE TABLE IF NOT EXISTS " + TABLE_AVENTURASUSUARIO + " ("
			+ "_id" + " INTEGER PRIMARY KEY, "
			+ "nome" + " TEXT, "
			+ "latitude" + " TEXT, "
			+ "longitude" + " TEXT, "
			+ "travado" + " TEXT, "
			+ "tipo_objeto" + " TEXT" + ");";
			
	
	//Criacao da tabela de missoes de uma aventura de usuario
	
	//Metodo construtor da classe
	public DatabaseHandler(Context context){
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
		//Log.e("DB", CREATE_TABLE_USUARIO);
	}
	
	//Criando as tabelas
	@Override
	public void onCreate(SQLiteDatabase db) {
		//db.execSQL("DROP TABLE IF EXISTS " + TABLE_USUARIO);
		//db.execSQL("DROP TABLE IF EXISTS " + TABLE_AVENTURASUSUARIO);
		//db.execSQL("DROP TABLE IF EXISTS " + TABLE_OBJETOSAVENTURA);
		
		Log.e("ERRO DB", "Passei por aqui ...");
		
		db.execSQL(CREATE_TABLE_USUARIO);
		db.execSQL(CREATE_TABLE_AVENTURASUSUARIO);
		//db.execSQL(CREATE_TABLE_OBJETOSAVENTURA);
	}
	
	//Atualizando o banco de dados
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		//Se existir tabelas antigas, deleta-las
		db.execSQL("DROP TABLE IF EXISTS " + TABLE_USUARIO);
		db.execSQL("DROP TABLE IF EXISTS " + TABLE_AVENTURASUSUARIO);
		//db.execSQL("DROP TABLE IF EXISTS " + TABLE_OBJETOSAVENTURA);
		
		//Cria novamente as tabelas
		onCreate(db);
	}
	
	/*
	 * Inserindo informacoes do usuario no banco de dados criado
	 */
	
	public void addUser(String name, String email, String id, String id_avatar, String id_container, String id_mochila){
		
		SQLiteDatabase db = this.getWritableDatabase();
		
		ContentValues values = new ContentValues();
		values.put("_id", id);
		values.put("nome", name);
		values.put("email", email);
		values.put("id_avatar", id_avatar);
		values.put("id_container", id_container);
		values.put("id_mochila", id_mochila);
		
		//Inserindo linha no banco de dados
		db.insert(TABLE_USUARIO, null, values);
		db.close();
		
	}
	
	/*
	 *Inserindo informacoes das aventuras dos usuarios na tabela de aventuras criada no BD
	 */
	
	public void addUserAdventure(String id, String titulo, String descricao){
		
		SQLiteDatabase db = this.getWritableDatabase();
		
		ContentValues values = new ContentValues();
		values.put("_id", id);
		values.put("titulo", titulo);
		values.put("descricao", descricao);
		
		//Inserindo linha no banco de dados
		db.insert(TABLE_AVENTURASUSUARIO, null, values);
		db.close();
	}
	
	/* FUNCAO NAO MAIS UTILIZADA
	 * Inserindo os objetos de uma aventura dada
	 * Pensei melhor e acho que esta funcao nao eh necessaria
	 * Posso sincronizar diretamente com o banco MySql, mantendo assim a integridade do mesmo
	 */
	
	public void addAdventureObjects(String id, String nome, String latitude, String longitude, String travado, String tipo_objeto){
		
		SQLiteDatabase db = this.getWritableDatabase();
		
		ContentValues values = new ContentValues();
		values.put("_id", id);
		values.put("nome", nome);
		values.put("latitude", latitude);
		values.put("longitude", longitude);
		values.put("travado", travado);
		values.put("tipo_objeto", tipo_objeto);

		//Inserindo registro no banco de dados
		db.insert(TABLE_AVENTURASUSUARIO, null, values);
		db.close();
	}
	
	/*
	 * Selecionando informacoes do usuario no banco de dados
	 */
	
	public HashMap<String, String> getUserDetails(){
		
		HashMap<String, String> usuario = new HashMap<String, String>();
		String selectquery = "SELECT * FROM " + TABLE_USUARIO;
		
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery(selectquery, null);
		
		//Move para a primeira linha para selecionar o usuario
		cursor.moveToFirst();
		
		if(cursor.getCount() > 0){
			usuario.put("_id", cursor.getString(0));
			usuario.put("nome", cursor.getString(1));
			usuario.put("email", cursor.getString(5));
			usuario.put("id_avatar", cursor.getString(2));
			usuario.put("id_container", cursor.getString(3));
			usuario.put("id_mochila", cursor.getString(4));
		}
		cursor.close();
		db.close();
		
		//Retornando as informacoes do usuario
		return usuario;
	}
	
	/*
	 * Selecionando as informacoes das aventuras dos usuarios no banco de dados
	 */
	
	public Cursor getUserAdventuresDetails(){
		
		//ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>();
		
		//HashMap<String, String> adventures = new HashMap<String, String>();
		String selectquery = "SELECT * FROM " + TABLE_AVENTURASUSUARIO;
		
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery(selectquery, null);
		
		//Move para a primeira linha para selecionar o usuario
		cursor.moveToFirst();
		
		db.close();
		
		//Retornando as informacoes do usuario atraves do cursor
		return cursor;
	}
	
	/*
	 * Funcao para resetar o banco de dados
	 */
	public void resetTables(){
		SQLiteDatabase db = this.getWritableDatabase();
		//Deleta todas as linhas
		db.delete(TABLE_USUARIO, null, null);
		db.delete(TABLE_AVENTURASUSUARIO, null, null);
		//db.delete(TABLE_OBJETOSAVENTURA, null, null);
		db.close();
	}

}
